import { contextBridge, ipcRenderer } from 'electron';
import { OnLog } from './types';

/** 预加载脚本：preload与渲染进程webContents共用一个window，且在渲染进程加载页面前运行
 * 上下文隔离时，不能将Node.js、Electron的相关API给渲染进程直接使用，须通过contextBridge作中间桥梁，在预加载脚本中通过contextBridge.exposeInMainWorld暴露方法给window，供渲染进程使用
 * 上下文未隔离，可直接暴露给window
 */
let logListener: OnLog;

// 在隔离的渲染进程环境中暴露API
if( process.contextIsolated ){
  try{
    // api中定义的方法，须在global.d.ts中声明TS类型，以便渲染器在window.api中使用，可传实参
    // 不能直接使用@electron-toolkit/preload，因为它需要禁用 sandbox
    contextBridge.exposeInMainWorld( 'api', {
      fetchDirectory( isDefault = false ){
        return ipcRenderer.invoke( 'fetch-directory', isDefault );
      },
      fetchDict( filePath: string ){
        return ipcRenderer.invoke( 'fetch-dict', filePath );
      },
      saveDict( filePath: string, lines: string[] ){
        return ipcRenderer.invoke( 'save-dict', filePath, lines );
      }, // 主进程向渲染进程发消息，渲染进程通过window.onLog注册监听函数
      registerOnLog( listener: OnLog ){
        logListener = listener;
      }
    } );
    // 注册主进程->渲染进程的日志监听
    ipcRenderer.on( 'mainToRenderer', ( _: Electron.IpcRendererEvent, ...messages ) => {
      if( logListener ){
        logListener( messages );
      }
    } );
  }
  catch( error ){
    console.error( '预加载脚本定义出错：', error );
  }
}
else{
  new Error( '上下文隔离：process.contextIsolated，当前环境不能自定义Window' );
}
